#ifndef FILTER_HPP
#define FILTER_HPP

#include <array>
#include <deque>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>

#define FILTER_SIZE 20

// 方案1：环形缓冲区（推荐用于固定大小的滤波器）
class CircularBufferFilter {
public:
  CircularBufferFilter();
  void addData(cv::Point2f point, float weight);
  cv::Point2f getFilteredPoint() const;
  bool isFull() const { return size_ == FILTER_SIZE; }
  size_t size() const { return size_; }

private:
  std::array<cv::Point2f, FILTER_SIZE> points_;
  std::array<float, FILTER_SIZE> weights_;
  size_t index_ = 0;
  size_t size_ = 0; // 当前有效数据数量
};

// // 方案2：双端队列（推荐用于动态大小管理）
// class DequeFilter {
// public:
//   DequeFilter(size_t max_size = FILTER_SIZE);
//   void addData(cv::Point2f point, float weight);
//   cv::Point2f getFilteredPoint() const;
//   bool isFull() const { return points_.size() == max_size_; }
//   size_t size() const { return points_.size(); }

// private:
//   std::deque<cv::Point2f> points_;
//   std::deque<float> weights_;
//   size_t max_size_;
// };

// // 方案3：向量（推荐用于需要随机访问的场景）
// class VectorFilter {
// public:
//   VectorFilter(size_t max_size = FILTER_SIZE);
//   void addData(cv::Point2f point, float weight);
//   cv::Point2f getFilteredPoint() const;
//   bool isFull() const { return points_.size() == max_size_; }
//   size_t size() const { return points_.size(); }
//   void clear() {
//     points_.clear();
//     weights_.clear();
//   }

// private:
//   std::vector<cv::Point2f> points_;
//   std::vector<float> weights_;
//   size_t max_size_;
// };

// // 类型别名，方便切换不同实现
// using Filter = CircularBufferFilter; // 默认使用环形缓冲区

#endif // FILTER_HPP
